import librosa
import numpy as np
import matplotlib.pyplot as plt
# Загрузка аудиофайла
audio, sr = librosa.load('audio.wav', sr=22050)
# Информация
print(f"Sample rate: {sr} Hz")
print(f"Длительность: {len(audio)/sr:.2f} сек")
print(f"Shape: {audio.shape}")
# Визуализация waveform
plt.figure(figsize=(12, 4))
librosa.display.waveshow(audio, sr=sr)
plt.title('Waveform')
plt.xlabel('Время (с)')
plt.ylabel('Амплитуда')
🔷 3. Spectrogram (Спектрограмма)
Идея: визуализация частотного содержания во времени
- Ось X: время
- Ось Y: частота
- Цвет/Яркость: интенсивность (амплитуда/мощность)
- Метод: STFT (Short-Time Fourier Transform)
# Вычисление спектрограммы
D = librosa.stft(audio, n_fft=2048, hop_length=512)
magnitude = np.abs(D)
power = magnitude**2
# Преобразование в дБ
spectrogram_db = librosa.amplitude_to_db(magnitude, ref=np.max)
# Визуализация
plt.figure(figsize=(12, 4))
librosa.display.specshow(
spectrogram_db,
sr=sr,
hop_length=512,
x_axis='time',
y_axis='hz'
)
plt.colorbar(format='%+2.0f dB')
plt.title('Спектрограмма')
🔷 4. Mel-Spectrogram
Mel-шкала: шкала частот, близкая к восприятию человека
- Нелинейная шкала частот
- Больше деталей на низких частотах
- Меньше на высоких (где слух менее чувствителен)
- Стандарт для распознавания речи
# Mel-спектрограмма
mel_spec = librosa.feature.melspectrogram(
y=audio,
sr=sr,
n_fft=2048,
hop_length=512,
n_mels=128, # количество mel-полос
fmax=8000 # максимальная частота
)
# В дБ
mel_spec_db = librosa.power_to_db(mel_spec, ref=np.max)
# Визуализация
plt.figure(figsize=(12, 4))
librosa.display.specshow(
mel_spec_db,
sr=sr,
hop_length=512,
x_axis='time',
y_axis='mel'
)
plt.colorbar(format='%+2.0f dB')
plt.title('Mel-Спектрограмма')
🔷 5. MFCC (Mel-Frequency Cepstral Coefficients)
Цель: компактное представление спектра звука
- Шаги:
- Вычислить mel-спектрограмму
- Взять логарифм
- Применить DCT (Discrete Cosine Transform)
- Взять первые N коэффициентов
- Обычно: 13-40 коэффициентов
- Первый коэффициент: средняя энергия (часто удаляют)
# Вычисление MFCC
mfccs = librosa.feature.mfcc(
y=audio,
sr=sr,
n_mfcc=13, # количество коэффициентов
n_fft=2048,
hop_length=512
)
# Визуализация
plt.figure(figsize=(12, 4))
librosa.display.specshow(
mfccs,
sr=sr,
hop_length=512,
x_axis='time'
)
plt.colorbar()
plt.title('MFCC')
plt.ylabel('MFCC коэффициенты')
plt.show()
# Статистики для ML
mfcc_mean = np.mean(mfccs, axis=1)
mfcc_std = np.std(mfccs, axis=1)
features = np.concatenate([mfcc_mean, mfcc_std])
🔷 6. Дополнительные признаки
Признак Описание Применение
Zero Crossing Rate Частота смены знака Шумы vs музыка
Spectral Centroid Центр масс спектра Яркость звука
Spectral Rolloff Частота ниже которой 85% энергии Тембр
Chroma 12 pitch classes Музыкальный анализ
Tempo Темп в BPM Ритм
# Zero Crossing Rate
zcr = librosa.feature.zero_crossing_rate(audio)
# Spectral Centroid
spec_cent = librosa.feature.spectral_centroid(y=audio, sr=sr)
# Spectral Rolloff
spec_rolloff = librosa.feature.spectral_rolloff(y=audio, sr=sr)
# Chroma features
chroma = librosa.feature.chroma_stft(y=audio, sr=sr)
# Tempo
tempo, beats = librosa.beat.beat_track(y=audio, sr=sr)
print(f"Tempo: {tempo:.2f} BPM")
🔷 7. Предобработка аудио
# Удаление тишины
audio_trimmed, index = librosa.effects.trim(
audio,
top_db=20 # порог в дБ
)
# Нормализация
audio_norm = librosa.util.normalize(audio)
# Изменение sample rate
audio_resampled = librosa.resample(
audio,
orig_sr=sr,
target_sr=16000
)
# Добавление шума (augmentation)
noise = np.random.randn(len(audio))
audio_noisy = audio + 0.005 * noise
# Изменение высоты тона
audio_pitched = librosa.effects.pitch_shift(
audio,
sr=sr,
n_steps=2 # полутона
)
# Изменение скорости
audio_stretched = librosa.effects.time_stretch(
audio,
rate=1.2 # в 1.2 раза быстрее
)
🔷 8. Извлечение признаков для ML
def extract_features(audio_path):
"""Извлечь все признаки из аудио"""
# Загрузка
audio, sr = librosa.load(audio_path, sr=22050)
# MFCC
mfccs = librosa.feature.mfcc(y=audio, sr=sr, n_mfcc=13)
mfcc_mean = np.mean(mfccs, axis=1)
mfcc_std = np.std(mfccs, axis=1)
# Spectral features
spec_cent = librosa.feature.spectral_centroid(y=audio, sr=sr)
spec_cent_mean = np.mean(spec_cent)
zcr = librosa.feature.zero_crossing_rate(audio)
zcr_mean = np.mean(zcr)
# Chroma
chroma = librosa.feature.chroma_stft(y=audio, sr=sr)
chroma_mean = np.mean(chroma, axis=1)
# Объединение всех признаков
features = np.concatenate([
mfcc_mean,
mfcc_std,
[spec_cent_mean],
[zcr_mean],
chroma_mean
])
return features
# Использование
features = extract_features('audio.wav')
print(f"Feature vector shape: {features.shape}")
🔷 9. Data Augmentation
- Добавление шума: white noise, background noise
- Pitch shifting: изменение высоты тона
- Time stretching: изменение скорости
- Time shifting: сдвиг во времени
- Dynamic range compression: нормализация громкости
import audiomentations as A
# Библиотека для аугментации
augmenter = A.Compose([
A.AddGaussianNoise(min_amplitude=0.001, max_amplitude=0.015, p=0.5),
A.TimeStretch(min_rate=0.8, max_rate=1.2, p=0.5),
A.PitchShift(min_semitones=-4, max_semitones=4, p=0.5),
A.Shift(min_fraction=-0.5, max_fraction=0.5, p=0.5),
])
# Применение
augmented_audio = augmenter(samples=audio, sample_rate=sr)
🔷 10. Применения
✅ Распознавание речи (ASR)
- MFCC + RNN/Transformer
- Mel-спектрограмма + CNN
- wav2vec 2.0, Whisper
✅ Классификация звуков
- Музыкальные жанры
- Эмоции в речи
- Детекция событий (сирена, выстрел)
✅ Синтез речи (TTS)
- Mel-спектрограмма → Vocoder
- Tacotron 2, FastSpeech
✅ Музыкальный анализ
- Определение темпа, тональности
- Source separation
🔷 11. Параметры STFT
Параметр Описание Типичные значения
n_fftРазмер окна FFT 512, 1024, 2048
hop_lengthШаг окна n_fft/4 (512)
win_lengthДлина окна = n_fft
windowОконная функция 'hann' (по умолч.)
Частотное разрешение: sr / n_fft
Временное разрешение: hop_length / sr
Компромисс: большое n_fft → лучше частотное разрешение, но хуже временное
🔷 12. PyTorch/TensorFlow пайплайн
import torch
import torchaudio
import torchaudio.transforms as T
# Загрузка
waveform, sample_rate = torchaudio.load('audio.wav')
# Mel-спектрограмма трансформация
mel_transform = T.MelSpectrogram(
sample_rate=sample_rate,
n_fft=2048,
hop_length=512,
n_mels=128
)
# Применение
mel_spec = mel_transform(waveform)
# В дБ
power_to_db = T.AmplitudeToDB()
mel_spec_db = power_to_db(mel_spec)
# MFCC трансформация
mfcc_transform = T.MFCC(
sample_rate=sample_rate,
n_mfcc=13,
melkwargs={
'n_fft': 2048,
'hop_length': 512,
'n_mels': 128
}
)
mfcc = mfcc_transform(waveform)
print(f"Mel-spec shape: {mel_spec.shape}")
print(f"MFCC shape: {mfcc.shape}")
🔷 13. Чек-лист
- [ ] Выбрать sample rate: 16 kHz для речи, 22-44 kHz для музыки
- [ ] Предобработка: удалить тишину, нормализовать
- [ ] Выбрать представление: MFCC (компактно), Mel-spec (для DL)
- [ ] Настроить параметры: n_fft, hop_length
- [ ] Аугментация: шум, pitch shift, time stretch
- [ ] Извлечь статистики: mean, std для MFCC
- [ ] Визуализировать: проверить качество данных
💡 Объяснение заказчику:
«Спектрограмма — это как "фотография" звука, показывающая какие частоты присутствуют в каждый момент времени. MFCC — это компактный набор чисел, описывающих характеристики звука, который хорошо подходит для распознавания речи и музыки».